home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / _strptime.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  11KB  |  336 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import time
  5. import locale
  6. import calendar
  7. from re import compile as re_compile
  8. from re import IGNORECASE
  9. from re import escape as re_escape
  10. from datetime import date as datetime_date
  11.  
  12. try:
  13.     from thread import allocate_lock as _thread_allocate_lock
  14. except:
  15.     from dummy_thread import allocate_lock as _thread_allocate_lock
  16.  
  17. __author__ = 'Brett Cannon'
  18. __email__ = 'brett@python.org'
  19. __all__ = [
  20.     'strptime']
  21.  
  22. def _getlang():
  23.     return locale.getlocale(locale.LC_TIME)
  24.  
  25.  
  26. class LocaleTime(object):
  27.     
  28.     def __init__(self):
  29.         self.lang = _getlang()
  30.         self._LocaleTime__calc_weekday()
  31.         self._LocaleTime__calc_month()
  32.         self._LocaleTime__calc_am_pm()
  33.         self._LocaleTime__calc_timezone()
  34.         self._LocaleTime__calc_date_time()
  35.         if _getlang() != self.lang:
  36.             raise ValueError('locale changed during initialization')
  37.         
  38.  
  39.     
  40.     def __pad(self, seq, front):
  41.         seq = list(seq)
  42.         if front:
  43.             seq.insert(0, '')
  44.         else:
  45.             seq.append('')
  46.         return seq
  47.  
  48.     
  49.     def __calc_weekday(self):
  50.         a_weekday = [ calendar.day_abbr[i].lower() for i in range(7) ]
  51.         f_weekday = [ calendar.day_name[i].lower() for i in range(7) ]
  52.         self.a_weekday = a_weekday
  53.         self.f_weekday = f_weekday
  54.  
  55.     
  56.     def __calc_month(self):
  57.         a_month = [ calendar.month_abbr[i].lower() for i in range(13) ]
  58.         f_month = [ calendar.month_name[i].lower() for i in range(13) ]
  59.         self.a_month = a_month
  60.         self.f_month = f_month
  61.  
  62.     
  63.     def __calc_am_pm(self):
  64.         am_pm = []
  65.         for hour in (1, 22):
  66.             time_tuple = time.struct_time((1999, 3, 17, hour, 44, 55, 2, 76, 0))
  67.             am_pm.append(time.strftime('%p', time_tuple).lower())
  68.         
  69.         self.am_pm = am_pm
  70.  
  71.     
  72.     def __calc_date_time(self):
  73.         time_tuple = time.struct_time((1999, 3, 17, 22, 44, 55, 2, 76, 0))
  74.         date_time = [
  75.             None,
  76.             None,
  77.             None]
  78.         date_time[0] = time.strftime('%c', time_tuple).lower()
  79.         date_time[1] = time.strftime('%x', time_tuple).lower()
  80.         date_time[2] = time.strftime('%X', time_tuple).lower()
  81.         replacement_pairs = [
  82.             ('%', '%%'),
  83.             (self.f_weekday[2], '%A'),
  84.             (self.f_month[3], '%B'),
  85.             (self.a_weekday[2], '%a'),
  86.             (self.a_month[3], '%b'),
  87.             (self.am_pm[1], '%p'),
  88.             ('1999', '%Y'),
  89.             ('99', '%y'),
  90.             ('22', '%H'),
  91.             ('44', '%M'),
  92.             ('55', '%S'),
  93.             ('76', '%j'),
  94.             ('17', '%d'),
  95.             ('03', '%m'),
  96.             ('3', '%m'),
  97.             ('2', '%w'),
  98.             ('10', '%I')]
  99.         []([ (tz, '%Z') for tz_values in self.timezone for tz in tz_values ])
  100.         for offset, directive in ((0, '%c'), (1, '%x'), (2, '%X')):
  101.             current_format = date_time[offset]
  102.             for old, new in replacement_pairs:
  103.                 if old:
  104.                     current_format = current_format.replace(old, new)
  105.                     continue
  106.                 []
  107.             
  108.             time_tuple = time.struct_time((1999, 1, 3, 1, 1, 1, 6, 3, 0))
  109.             if '00' in time.strftime(directive, time_tuple):
  110.                 U_W = '%W'
  111.             else:
  112.                 U_W = '%U'
  113.             date_time[offset] = current_format.replace('11', U_W)
  114.         
  115.         self.LC_date_time = date_time[0]
  116.         self.LC_date = date_time[1]
  117.         self.LC_time = date_time[2]
  118.  
  119.     
  120.     def __calc_timezone(self):
  121.         
  122.         try:
  123.             time.tzset()
  124.         except AttributeError:
  125.             pass
  126.  
  127.         no_saving = frozenset([
  128.             'utc',
  129.             'gmt',
  130.             time.tzname[0].lower()])
  131.         if time.daylight:
  132.             has_saving = frozenset([
  133.                 time.tzname[1].lower()])
  134.         else:
  135.             has_saving = frozenset()
  136.         self.timezone = (no_saving, has_saving)
  137.  
  138.  
  139.  
  140. class TimeRE(dict):
  141.     
  142.     def __init__(self, locale_time = None):
  143.         if locale_time:
  144.             self.locale_time = locale_time
  145.         else:
  146.             self.locale_time = LocaleTime()
  147.         base = super(TimeRE, self)
  148.         base.__init__({
  149.             'd': '(?P<d>3[0-1]|[1-2]\\d|0[1-9]|[1-9]| [1-9])',
  150.             'H': '(?P<H>2[0-3]|[0-1]\\d|\\d)',
  151.             'I': '(?P<I>1[0-2]|0[1-9]|[1-9])',
  152.             'j': '(?P<j>36[0-6]|3[0-5]\\d|[1-2]\\d\\d|0[1-9]\\d|00[1-9]|[1-9]\\d|0[1-9]|[1-9])',
  153.             'm': '(?P<m>1[0-2]|0[1-9]|[1-9])',
  154.             'M': '(?P<M>[0-5]\\d|\\d)',
  155.             'S': '(?P<S>6[0-1]|[0-5]\\d|\\d)',
  156.             'U': '(?P<U>5[0-3]|[0-4]\\d|\\d)',
  157.             'w': '(?P<w>[0-6])',
  158.             'y': '(?P<y>\\d\\d)',
  159.             'Y': '(?P<Y>\\d\\d\\d\\d)',
  160.             'A': self._TimeRE__seqToRE(self.locale_time.f_weekday, 'A'),
  161.             'a': self._TimeRE__seqToRE(self.locale_time.a_weekday, 'a'),
  162.             'B': self._TimeRE__seqToRE(self.locale_time.f_month[1:], 'B'),
  163.             'b': self._TimeRE__seqToRE(self.locale_time.a_month[1:], 'b'),
  164.             'p': self._TimeRE__seqToRE(self.locale_time.am_pm, 'p'),
  165.             'Z': self._TimeRE__seqToRE((lambda .0: for tz_names in .0:
  166. for tz in tz_names:
  167. tz)(self.locale_time.timezone), 'Z'),
  168.             '%': '%' })
  169.         base.__setitem__('W', base.__getitem__('U').replace('U', 'W'))
  170.         base.__setitem__('c', self.pattern(self.locale_time.LC_date_time))
  171.         base.__setitem__('x', self.pattern(self.locale_time.LC_date))
  172.         base.__setitem__('X', self.pattern(self.locale_time.LC_time))
  173.  
  174.     
  175.     def __seqToRE(self, to_convert, directive):
  176.         to_convert = sorted(to_convert, key = len, reverse = True)
  177.         for value in to_convert:
  178.             if value != '':
  179.                 break
  180.                 continue
  181.         else:
  182.             return ''
  183.         regex = '|'.join((lambda .0: for stuff in .0:
  184. re_escape(stuff))(to_convert))
  185.         regex = '(?P<%s>%s' % (directive, regex)
  186.         return '%s)' % regex
  187.  
  188.     
  189.     def pattern(self, format):
  190.         processed_format = ''
  191.         regex_chars = re_compile('([\\\\.^$*+?\\(\\){}\\[\\]|])')
  192.         format = regex_chars.sub('\\\\\\1', format)
  193.         whitespace_replacement = re_compile('\\s+')
  194.         format = whitespace_replacement.sub('\\s+', format)
  195.         while '%' in format:
  196.             directive_index = format.index('%') + 1
  197.             processed_format = '%s%s%s' % (processed_format, format[:directive_index - 1], self[format[directive_index]])
  198.             format = format[directive_index + 1:]
  199.         return '%s%s' % (processed_format, format)
  200.  
  201.     
  202.     def compile(self, format):
  203.         return re_compile(self.pattern(format), IGNORECASE)
  204.  
  205.  
  206. _cache_lock = _thread_allocate_lock()
  207. _TimeRE_cache = TimeRE()
  208. _CACHE_MAX_SIZE = 5
  209. _regex_cache = { }
  210.  
  211. def _calc_julian_from_U_or_W(year, week_of_year, day_of_week, week_starts_Mon):
  212.     first_weekday = datetime_date(year, 1, 1).weekday()
  213.     if not week_starts_Mon:
  214.         first_weekday = (first_weekday + 1) % 7
  215.         day_of_week = (day_of_week + 1) % 7
  216.     
  217.     week_0_length = (7 - first_weekday) % 7
  218.     if week_of_year == 0:
  219.         return 1 + day_of_week - first_weekday
  220.     else:
  221.         days_to_week = week_0_length + 7 * (week_of_year - 1)
  222.         return 1 + days_to_week + day_of_week
  223.  
  224.  
  225. def strptime(data_string, format = '%a %b %d %H:%M:%S %Y'):
  226.     global _TimeRE_cache
  227.     _cache_lock.acquire()
  228.     
  229.     try:
  230.         if _getlang() != _TimeRE_cache.locale_time.lang:
  231.             _TimeRE_cache = TimeRE()
  232.             _regex_cache.clear()
  233.         
  234.         if len(_regex_cache) > _CACHE_MAX_SIZE:
  235.             _regex_cache.clear()
  236.         
  237.         locale_time = _TimeRE_cache.locale_time
  238.         format_regex = _regex_cache.get(format)
  239.         if not format_regex:
  240.             
  241.             try:
  242.                 format_regex = _TimeRE_cache.compile(format)
  243.             except KeyError:
  244.                 err = None
  245.                 bad_directive = err.args[0]
  246.                 if bad_directive == '\\':
  247.                     bad_directive = '%'
  248.                 
  249.                 del err
  250.                 raise ValueError("'%s' is a bad directive in format '%s'" % (bad_directive, format))
  251.             except IndexError:
  252.                 raise ValueError("stray %% in format '%s'" % format)
  253.  
  254.             _regex_cache[format] = format_regex
  255.     finally:
  256.         _cache_lock.release()
  257.  
  258.     found = format_regex.match(data_string)
  259.     if not found:
  260.         raise ValueError('time data did not match format:  data=%s  fmt=%s' % (data_string, format))
  261.     
  262.     if len(data_string) != found.end():
  263.         raise ValueError('unconverted data remains: %s' % data_string[found.end():])
  264.     
  265.     year = 1900
  266.     month = day = 1
  267.     hour = minute = second = 0
  268.     tz = -1
  269.     week_of_year = -1
  270.     week_of_year_start = -1
  271.     weekday = julian = -1
  272.     found_dict = found.groupdict()
  273.     for group_key in found_dict.iterkeys():
  274.         if group_key == 'y':
  275.             year = int(found_dict['y'])
  276.             if year <= 68:
  277.                 year += 2000
  278.             else:
  279.                 year += 1900
  280.         year <= 68
  281.         if group_key == 'Y':
  282.             year = int(found_dict['Y'])
  283.             continue
  284.         if group_key == 'm':
  285.             month = int(found_dict['m'])
  286.             continue
  287.         if group_key == 'B':
  288.             month = locale_time.f_month.index(found_dict['B'].lower())
  289.             continue
  290.         if group_key == 'b':
  291.             month = locale_time.a_month.index(found_dict['b'].lower())
  292.             continue
  293.         if group_key == 'd':
  294.             day = int(found_dict['d'])
  295.             continue
  296.         None if group_key == 'H' else ampm in ('', locale_time.am_pm[0])
  297.         if group_key == 'M':
  298.             minute = int(found_dict['M'])
  299.             continue
  300.         if group_key == 'S':
  301.             second = int(found_dict['S'])
  302.             continue
  303.         if group_key == 'A':
  304.             weekday = locale_time.f_weekday.index(found_dict['A'].lower())
  305.             continue
  306.         None if group_key == 'a' else weekday == 0
  307.         None if group_key == 'j' else group_key == 'U'
  308.         if group_key == 'Z':
  309.             found_zone = found_dict['Z'].lower()
  310.             for value, tz_values in enumerate(locale_time.timezone):
  311.                 if found_zone in tz_values:
  312.                     if time.tzname[0] == time.tzname[1] and time.daylight and found_zone not in ('utc', 'gmt'):
  313.                         break
  314.                     else:
  315.                         tz = value
  316.                         break
  317.                 found_zone not in ('utc', 'gmt')
  318.             
  319.     
  320.     if julian == -1 and week_of_year != -1 and weekday != -1:
  321.         week_starts_Mon = None if week_of_year_start == 0 else False
  322.         julian = _calc_julian_from_U_or_W(year, week_of_year, weekday, week_starts_Mon)
  323.     
  324.     if julian == -1:
  325.         julian = (datetime_date(year, month, day).toordinal() - datetime_date(year, 1, 1).toordinal()) + 1
  326.     else:
  327.         datetime_result = datetime_date.fromordinal((julian - 1) + datetime_date(year, 1, 1).toordinal())
  328.         year = datetime_result.year
  329.         month = datetime_result.month
  330.         day = datetime_result.day
  331.     if weekday == -1:
  332.         weekday = datetime_date(year, month, day).weekday()
  333.     
  334.     return time.struct_time((year, month, day, hour, minute, second, weekday, julian, tz))
  335.  
  336.